package com.zhxy.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * 日期区间计算的工具类。
 * 
 * @author xinyue.zheng
 */
public abstract class DateRangeUtils {

    public static final String FORMAT_DATE_NORMAL = "yyyy-MM-dd";

    /**
     * 今天。
     * @param pattern 日期格式化的模式
     */
    public static String today(String pattern) {
        return format(today(), pattern);
    }

    /**
     * 格式化日期
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {
        if (StringUtils.isBlank(pattern)) {
            pattern = FORMAT_DATE_NORMAL;
        }
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(date);
    }

    /**
     * 今天。
     */
    public static Date today() {
        return new Date();
    }

    /**
     * 昨天。
     * @param pattern 日期格式化的模式
     */
    public static String yesterday(String pattern) {
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(yesterday());
    }

    /**
     * 昨天。
     */
    public static Date yesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        return cal.getTime();
    }

    /**
     * 得到几天后的时间
     * @param d
     * @param day
     * @return
     */
    public static Date getDateAfter(Date d, int day) {
        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
        return now.getTime();
    }

    /**
     * 取得指定日期过 months 月后的日期 (当 months 为负数表示指定月之前);
     * 
     * @param date
     *            日期 为null时表示当天
     * @param month
     *            相加(相减)的月数
     */
    public static Date nextMonth(Date date, int months) {
        Calendar cal = Calendar.getInstance();
        if (date != null) {
            cal.setTime(date);
        }
        cal.add(Calendar.MONTH, months);
        return cal.getTime();
    }

    /**
     * 取得指定日期过 day 天后的日期 (当 day 为负数表示指定月之前);
     * 
     * @param date
     *            日期 为null时表示当天
     * @param month
     *            相加(相减)的月数
     */
    public static Date nextDay(Date date, int day) {
        Calendar cal = Calendar.getInstance();
        if (date != null) {
            cal.setTime(date);
        }
        cal.add(Calendar.DAY_OF_YEAR, day);
        return cal.getTime();
    }

    /**
     * 取得指定日期过 年后的日期 (当 day 为负数表示指定年之前);
     * 
     * @param date
     *            日期 为null时表示当天
     * @param month
     *            相加(相减)的年数
     */
    public static Date nextYear(Date date, int year) {
        Calendar cal = Calendar.getInstance();
        if (date != null) {
            cal.setTime(date);
        }
        cal.add(Calendar.YEAR, year);
        return cal.getTime();
    }

}
